#include <cstddef>
#include <iostream>
#include <iterator>
using namespace std;

class Node 
{
public:
    int data;//数据储存
    Node* next;//一个指向Node的指针，用于存储链表中的下一个节点的地址

    //这是带默认参数的构造函数
    //在C++中:表示在构造函数中用于初始化成员变量为特定的值
    //同时需要注意构造函数需要放在public中
    Node(int data,Node* next=nullptr):data(data),next(next){}
};

//这是单个链表内的操作
class Linklist{
    public:
    Node* head;
    Linklist():head(nullptr){}//Linklist类的构造函数

    void addToTail(int data)
    {
        if(head == nullptr)//若头指针是空指针
        {
            head=new Node(data);//新建一个节点
        }
        else//非空指针，已经有数据
        {
            Node* temp=head; //找到头指针，并存放在temp
            while(temp->next != nullptr)//轮询找到空指针
            {
                temp=temp->next;
            }
            temp->next=new Node(data);//新建节点
        }
    }

    /**
     * @brief 链表数据读取函数
     * 
     * @param pos 数据位置
     * @return int 返回数据
     */
    int readData(int pos)
    {
        int i=0;
        Node* temp=head;
        while(i<pos-1)
        {
            i++;
            temp=temp->next;
        }
        return temp->data;
    }
    
    /**
     * @brief 链表数据插入函数
     * 
     * @param data 待插入数据
     * @param n 目标插入位置的前一个节点
     */
    void insertNode(int data,int pos)
    {
        if(head==nullptr || pos<=0)
        {
            head = new Node(data,head);
            return;
        }


        if(pos>1)
        {
            Node* temp=head;
            for(int i=1;i<pos-1&&temp->next!=nullptr;i++)
            {
                temp=temp->next;
            }
            temp->next=new Node(data,temp->next);
        }
        else
        {
            Node* temp=head;
            head=new Node(data,temp);
        }
        
        
    }

    void deleteNode(int pos)
    {
        if(head==nullptr)
        {
            return;
        }

        if(pos>1)
        {
            Node* temp=head;
            for(int i=1;i<pos-1;i++)
            {
                temp=temp->next;
            }
            temp->next=temp->next->next;
        }
        else
        {
            head=head->next;
        }

        return ;
    }

    /**
     * @brief 链表打印函数
     * 
     */
    void print()
    {
        Node* temp=head;
        while(temp != nullptr)
        {
            cout<<temp->data<<" ";
            temp=temp->next;
        }
        cout<<endl;
    }


    ~Linklist()
    {
        while(head !=nullptr)
        {
            Node* temp=head;
            head = head->next;
            delete temp;
        }
    }
};

int main(int argc,char **argv)
{
    Linklist list;
    //填充数据
    list.addToTail(2);
    list.addToTail(4);
    list.addToTail(3);
    list.addToTail(5);
    list.addToTail(7);
    list.print();

    //按照指定位置给出数据
    cout<<list.readData(4)<<endl;
    
    //插入数据
    list.insertNode(9, 1);
    list.print();

    //删除数据
    list.deleteNode(1);
    list.print();
    return 0;
}